package logindbmanager

// // queryLastLoginGID 查询玩家最后一次登录的服务器
// func (this *LoginDBManager) queryLastLoginGID(uid uint64) uint32 {
// 	pmd := &protoMsg.PlayerMD{}
// 	if err := this.MysqlDB.Order("updated_at desc").First(pmd, "uid=?", uid).Error; err != nil && err == gorm.ErrRecordNotFound {
// 		logger.Debugf("LoginDBManager queryLastLoginData err: %s", err.Error())
// 		return 0
// 	}
// 	return pmd.GID
// }

// // queryNewGID 查询一个最新的服务器
// func (this *LoginDBManager) queryNewGID() uint32 {
// 	smd := &protoMsg.GroupMD{}
// 	result := this.MysqlDB.Order("updated_at desc").First(smd)
// 	if result.Error != nil {
// 		logger.Debugf("LoginDBManager queryNewSrvID err: %s", result.Error.Error())
// 		return 0
// 	}
// 	return smd.GroupID
// }

// // GetGroupMDByCache 查询服务器数据
// func (this *LoginDBManager) GetGroupMDByCache(gid uint32) (result *protoMsg.GroupMD) {
// 	util.UsingRead(&this.lkGroupList, func() {
// 		if md, ok := this.groupList[gid]; ok {
// 			result = md
// 		} else {
// 			result = nil
// 		}
// 	})
// 	return
// 	// result = &models.GroupMD{GroupID: gid}
// 	// if err := this.MysqlDB.First(result).Error; err != nil && err == gorm.ErrRecordNotFound {
// 	// 	return nil
// 	// }
// 	// return
// }

// // 查询DB区服列表
// func (this *LoginDBManager) QueryGroupList() (groups []*protoMsg.GroupMD) {
// 	// util.UsingRead(this.lkGroupList, func() {
// 	// 	groups = this.groupList
// 	// })
// 	// return
// 	_ = this.MysqlDB.Find(&groups).Error
// 	return
// }

// // QueryRecommendGroupID 根据uid查询推荐服务器
// func (this *LoginDBManager) QueryRecommendGroupID(uid uint64) uint32 {
// 	srvID := this.queryLastLoginGID(uid)
// 	if srvID != 0 {
// 		return srvID
// 	}
// 	return this.queryNewGID()
// }

// // InitGroupDB 初始化Group数据
// func (this *LoginDBManager) InitGroupDB() {

// }

// // 加载所有服务器信息，还有定时更新服务器信息和他们的gateway状态信息
// func (this *LoginDBManager) LoadServer(tgo *threads.ThreadGo, duration time.Duration) {
// 	//先拿所有表信息
// 	tli := make(map[uint32]*protoMsg.GroupMD)
// 	tli = this.QueryGroupListMap() //首次获得区服列表

// 	//再拿所有服务器的Gateway信息
// 	serverMgr.NewDiscoveryMgr(nil, tgo)
// 	serverMgr.GetServerMgr().WatchGateway(serverMgr.NewServerMapByType())
// 	{
// 		if sli, err := serverMgr.GetServerMgr().GetGwayList(); err != nil {
// 			log.Error(err)
// 		} else {
// 			ServerLoadSum2(tli, sli, false)
// 		}

// 	}
// 	this.groupList = tli

// 	//第一次load之后需要更新下缓存数据
// 	this.MakeCacheAllSrvList(this.groupList)

// 	tgo.Go(func(ctx context.Context) {
// 		ticker := time.NewTicker(duration * time.Second)
// 		defer ticker.Stop()
// 		for {

// 			select {
// 			case <-ticker.C:

// 				this.lkWhiteList.Lock()
// 				this.whiteList = this.QueryGetAllWhiteListMD()
// 				this.lkWhiteList.Unlock()
// 				/*
// 					使用ETCD后，有了新的思路
// 					可以拿到原来的MAP进行model复制
// 					然后尝试填充
// 					填充的时候，发现有服务器没有找到对应的GROUP
// 					这个时候，才回来进行DB的读
// 					然后再进行一次填充；
// 				*/
// 				tli = this.QueryGroupListMap() //定时获取DB的小区服数据
// 				gateList, err := serverMgr.GetServerMgr().GetGwayList()
// 				if err != nil {
// 					log.Error(err)
// 				}
// 				if !ServerLoadSum2(tli, gateList, true) { //发现有新的网关,区服可能要更新一下.
// 					//有没找到的group所以需要从DB拿一次
// 					tli = this.QueryGroupListMap() //重新获得新的小区服列表
// 					ServerLoadSum2(tli, gateList, false)
// 				}

// 				// //先拿所有表信息
// 				// tli = make(map[uint32]*models.GroupMD)
// 				// {
// 				// 	li := make([]*models.GroupMD, 0)
// 				// 	this.MysqlDB.Find(&li)
// 				// 	for _, md := range li {
// 				// 		tli[md.GroupID] = md
// 				// 	}
// 				// }
// 				//再拿所有服务器的Gateway信息
// 				// {
// 				// 	for _, s := range tli {
// 				// 		if gateList, err := serverMgr.GetServerMgr().GetServerList(s.GroupID, iserver.ServerTypeGateway); err != nil {
// 				// 			log.Error(err)
// 				// 		} else {
// 				// 			ServerLoadSum(s, gateList)
// 				// 		}
// 				// 	}
// 				// }
// 				// if gateList, err := serverMgr.GetServerMgr().GetGwayList(); err != nil {
// 				// 	log.Error(err)
// 				// } else {
// 				// 	ServerLoadSum2(tli, gateList)
// 				// }
// 				util.UsingWiter(&this.lkGroupList, func() {
// 					this.groupList = tli
// 				})
// 				//每次必定更新下客户端消息缓存数据
// 				this.MakeCacheAllSrvList(tli)

// 			case <-ctx.Done():
// 				return
// 			}
// 		}
// 	})
// }

// func (this *LoginDBManager) QueryGroupListMap() (tli map[uint32]*protoMsg.GroupMD) {
// 	tli = make(map[uint32]*protoMsg.GroupMD)
// 	li := this.QueryGroupList() //重新获得新的小区服列表
// 	for _, md := range li {
// 		tli[md.GroupID] = md
// 	}
// 	return
// }

// func (this *LoginDBManager) QueryGroupListMapByCache() (tli map[uint32]*protoMsg.GroupMD) {
// 	util.UsingRead(&this.lkGroupList, func() {
// 		tli = this.groupList
// 	})
// 	return
// }

// func ServerLoadSum(s *protoMsg.GroupMD, sli []*iserver.ServerInfo) {

// 	if len(sli) == 0 {
// 		s.Load = -1
// 		return
// 	}
// 	s.Load = 0
// 	for _, smd := range sli {
// 		s.Load += int64(smd.Load)
// 	}
// 	s.Load = s.Load / int64(len(sli))
// }

// // 更新服务器的负载信息 (根据网关上报的负载数据)
// func ServerLoadSum2(gli map[uint32]*protoMsg.GroupMD, sli []iserver.ServerInfo, isforend bool) bool {
// 	for _, s := range gli {
// 		s.Load = 0 //负载 稍后计算
// 		s.Sum = 0  //小区可用的Gateway数量 稍后设置
// 	}
// 	for _, sinfo := range sli {
// 		if s, ok := gli[sinfo.Group]; ok {
// 			s.Load += int64(sinfo.Load) //网关负载相加,稍后会取平均值
// 			s.Sum++
// 		} else if isforend {
// 			return false
// 		}
// 	}
// 	for _, s := range gli {
// 		if s.Sum == 0 {
// 			s.Load = -1 //没有网关,负载设置 特殊值-1
// 			// NOTE: 不要多此一举,SrvStatus是运营设置的,正常没有启动服务器的,客户端会根据Load来设置维护状态的.
// 			//if s.SrvStatus == protoMsg.SrvStatusEnum_Normal {
// 			//	s.SrvStatus = protoMsg.SrvStatusEnum_Maintenance //没找到网关,则设置为 维护中
// 			//}
// 		} else {
// 			s.Load = s.Load / s.Sum //取平均值
// 		}
// 		// logger.Infof("Group:%v Load=%v sum=%v", s.GroupID, s.Load, s.Sum)
// 	}
// 	return true
// }
